\chapter{词法元素}

Tenon语言的词法分析器会把Tenon语言的源代码的字符序列解析为\verb!词法元素!（也称为\verb!记号!）的序列。
词法元素会全部作为语法分析时的终结符，包括以下几类：
\begin{itemize}
	\item 关键字
	\item 标识符
	\item 字面量
    \item 标点符号
\end{itemize}

在词法分析过程中，\verb!空白!和\verb!注释!会被跳过不处理。本章也对注释和空白加以描述。

\section{关键字}

以下词语（大小写敏感）被用作Tenon语言的关键字，因而不能用于其它用途。

\begin{lstlisting}[numbers=none]
alias anytype backward bool break case const default else
enum error false for if local module num opaque pers
record return shared string switch true undo void while
\end{lstlisting}

\section{标识符}

标识符是一个字符序列，用于标识类型、变量、函数和模块等。
Tenon语言的标识符由字母、数字和下划线组成，且起始字符只能是字母或者下划线。
需要注意的是，标识符不能使用关键字。

Tenon语言是大小写敏感的，因此，func和FUNC是不同的标识符。

Tenon语言使用的字母：

\begin{verbatim}
     a  b   c   d   e   f   g   h   i   j   k   l   m
     n  o   p   q   r   s   t   u   v   w   x   y   z
     A  B   C   D   E   F   G   H   I   J   K   L   M
     N  O   P   Q   R   S   T   U   V   W   X   Y   Z
\end{verbatim}

Tenon语言使用的数字：

\begin{verbatim}
    0   1   2   3   4   5   6   7   8   9
\end{verbatim}

TO DO: 标识符的长度限制

TO DO: 保留标识符，例如\_\_file\_\_, \_\_func\_\_

\section{字面量}
Tenon语言包含三种字面量，分别是\verb!字符串字面量!、\verb!数值字面量!以及\verb!布尔值字面量!，
对应于Tenon的三种内置类型：字符串类型、数值类型、布尔类型。
Tenon语言中只有一种数值类型，因此应使用浮点数实现。

字面量所代表的值，应限定在其相应类型实现所能表达的值的范围内。
例如，对于数值类型，实现为单精度浮点数时，其范围为-3.40E+38 ~ +3.40E+38。

\vspace{2ex}

\noindent \textbf{字符串字面量}

字符串字面量是指由一对双引号包括的0个或多个字符的字符序列，例如\textquotedbl abc\textquotedbl。
如果字符序列中需要使用双引号，则应该在双引号前使用反斜线进行转义,
例如\textquotedbl a\textbackslash\textquotedbl bc\textquotedbl。除此之外，还有一些其它的转义字符：

\vspace{2ex}

\begin{tabular}{|>{\centering\arraybackslash}p{4em}|>{\centering\arraybackslash}p{8em}|>{\centering\arraybackslash}p{4em}|>{\centering\arraybackslash}p{8em}|}
\hline
转义字符 & 含义 & 转义字符 & 含义\\
\hline
 \textbackslash\textquotesingle & 单引号 & \textbackslash\textquotedbl & 双引号\\
 \textbackslash? & 问号 & \textbackslash\textbackslash & 反斜杠\\
 \textbackslash a & 响铃 & \textbackslash b & 退格\\
 \textbackslash f & 换页 & \textbackslash n & 换行\\
 \textbackslash r & 回车 & \textbackslash t & 水平制表\\
 \textbackslash v & 垂直制表 & \textbackslash ddd & 3位8进制字符\\
 \textbackslash x hh & 2位16进制字符 &   &  \\
\hline
\end{tabular}

\vspace{2ex}

单引号和问号既可以使用其自身的形式，也可以使用转义字符的形式，
而双引号和反斜杠必须使用转义字符的形式。

当使用8进制字符串时，其中的8进制数字序列包含3个字符，不足3个的前面用0补足，
并且每个8进制字符都需要使用反斜线进行转义，
例如\textquotedbl\textbackslash 141\textbackslash 053\textbackslash 060\textquotedbl。

当使用16进制字符串时，其中的16进制数字序列包含2个字符，不足2个的前面用0补足，
并且每个16进制字符都需要使用反斜线进行转义，
例如\textquotedbl\textbackslash x68\textbackslash x65\textbackslash x65\textquotedbl。

\vspace{2ex}

\noindent \textbf{数值字面量}

数值字面量是一个由数字、字母E和e、符号+、-、.构成的字符序列，包含系数部分和可选的指数部分。
其中，系数部分是由数字及可选的一个符号.构成的字符序列，例如1， 1.， 1.2， .2；
指数部分以字母E或e开头，后跟可选的符号+或-，最后是由数字构成的字符序列，例如E+2，e-03，e30。

数值字面量示例：

\begin{verbatim}
    123     123.    .123        1.23E+2
    1.23    1.230   123e-2      123e-02
\end{verbatim}

\noindent \textbf{布尔值字面量}

布尔值字面量只有两种，分别是代表真值的关键字true及代表假值的关键字false。

\section{标点符号}

Tenon语言使用了下面的标点符号。标点符号或者用于分隔不同的语法元素；
或者用于代表指定操作（例如+用于表示两个操作数相加）。

\begin{verbatim}
     [     ]     (     )     {    }
     ++    --    +     -     *    /
     <=    >=    ==    !=    >    <
     //    &&    ||    .     ,    :
     ;     ...   ::
\end{verbatim}

\section{注释和空白}

Tenon的注释是由感叹号//开始，直到行尾的所有字符。多行注释需要在每行的开头都使用//符号。注释会被编译器忽略。

注释示例：

\begin{verbatim}
    // 将a的值加1
    ++a;
\end{verbatim}

空白包括空格、制表符、换行符等字符。除字符串中的空白以及用于分隔不同词法元素的空白之外的空白，
会被编译器忽略。

空白示例：

\begin{verbatim}
    // 下面的代码和 a = c + d; 是等效的
    a =         c + d;
\end{verbatim}
